essential OOP concepts